#include "list.h"
#include <string.h>	/* strcpy */
#include <stdio.h>	/* printf */

#define USER_DATA_SIZE	32

#define USER_TEST_COUNT	6
#define USER_STRING1	"HELLO WORLD!"
#define USER_STRING2	"hello world!"
#define USER_STRING3	"this is a test"
#define USER_STRING4	"string 4"
#define USER_STRING5	"my name is"
#define USER_STRING6	"demo"

typedef struct userlist {
	struct list_head node;		/* 每个数据都绑定一个链表节点 */
	char data[USER_DATA_SIZE];	/* 携带的数据 */
} userlist_t;

static char *str[USER_TEST_COUNT] = {USER_STRING1, USER_STRING2,
									 USER_STRING3, USER_STRING4,
									 USER_STRING5, USER_STRING6};
static userlist_t userdata[USER_TEST_COUNT];

int main()
{
	struct list_head free, used;	/* 链表入口 */
	struct list_head *pos, *n;		/* 临时变量 */
	int i;
	
	init_list_head(&free);
	/* 初始化，将所有数据放到未使用队列（如果使用malloc则可省去此步骤） */
	for (i = 0; i < USER_TEST_COUNT; i++)
		list_add(&userdata[i].node, &free);

	init_list_head(&used);
	/* 获取所有数据空间并赋值，将已赋值的空间放入已使用队列 */
	i = 0;
	printf("\nput:\n");
	list_for_each_safe(pos, n, &free) {
		list_del(pos);
		userlist_t *datanode = list_entry(pos, userlist_t, node);
		printf("[%d] %s\n", i, str[i]);
		strcpy(datanode->data, str[i++]);
		list_add(&datanode->node, &used);
	}

	/* 获取并打印所有数据，将已使用完的空间重新放入空闲队列 */
	i = 0;
	printf("\nget:\n");
	list_for_each_safe(pos, n, &used) {
		list_del(pos);
		userlist_t *datanode = list_entry(pos, userlist_t, node);
		printf("[%d] %s\n", ++i, datanode->data);
		list_add(&datanode->node, &free);
	}

	return 0;
}
